package raycast;

import javax.vecmath.Vector3d;

import Camera.Camera;
import Camera.PinHoleCamera;

public class Ray {
	private Vector3d rayvec; /* Vector que representa un rayo */
	
	/**
	 * 
	 * @param camera
	 * @param initVector Vector director de la recta que representa el primer rayo de todos
	 * @param i desplazamiento vertical del rayo respecto de initVector (positivo en el eje -y)
	 * @param j desplazamiento horizontal del rayo respecto de initVector (positivo en el eje +x)
	 */
	
	public Ray(Camera camera, double i, double j) {
		if (camera == null) {
			throw new IllegalArgumentException("Camera is null");
		}
		
		/* Extensibilidad, segun que tipo de camara es, el rayo se
		 * calcula de formas distintas
		 */
		
		if (camera instanceof PinHoleCamera) {
			/* modularizar todo esto a una funcion */
			PinHoleCamera pc = (PinHoleCamera)camera;
			Vector3d deltaH, deltaV;
			
			/* Calcula cuanto desplazar el topLeft horizontalmente en el eje +x
			 * y verticalmente en el eje -y
			 */
			deltaH = new Vector3d(pc.getRight());
			deltaV = new Vector3d(pc.getUp());
			deltaV.negate(); // Se desplaza en el -y
			
			deltaH.scale(i);
			deltaV.scale(j);
			
			this.rayvec = new Vector3d(pc.getTopLeft());
			this.rayvec.add(deltaH);
			this.rayvec.add(deltaV);
		}
		
	}
	
}
